{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n",
      "sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.0.3\n",
      "numpy 1.16.2\n",
      "pandas 0.24.2\n",
      "sklearn 0.20.3\n",
      "tensorflow 2.0.0-alpha0\n",
      "tensorflow.python.keras.api._v2.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "'''\n",
    "深度可分离卷积：卷积核针对某个通道进行数据采集，而不是针对全部通道\n",
    "优点：\n",
    "\n",
    "1. 相比于使用一般的卷积操作，因为卷积核没有厚度，使得模型参数大大减少，可以在手机上进行训练\n",
    "2. 由于对不同通道使用了不同的卷积核，因此所得到的数据特征更加丰富，模型更好\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5000, 28, 28) (5000,)\n",
      "(55000, 28, 28) (55000,)\n",
      "(10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "fashion_mnist = keras.datasets.fashion_mnist\n",
    "(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()\n",
    "x_valid, x_train = x_train_all[:5000], x_train_all[5000:]\n",
    "y_valid, y_train = y_train_all[:5000], y_train_all[5000:]\n",
    "\n",
    "print(x_valid.shape, y_valid.shape)\n",
    "print(x_train.shape, y_train.shape)\n",
    "print(x_test.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "x_train_scaled = scaler.fit_transform(\n",
    "    x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)\n",
    "x_valid_scaled = scaler.transform(\n",
    "    x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)\n",
    "x_test_scaled = scaler.transform(\n",
    "    x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential()\n",
    "model.add(keras.layers.Conv2D(filters=32, kernel_size=3,\n",
    "                              padding='same',\n",
    "                              activation='selu',\n",
    "                              input_shape=(28, 28, 1)))\n",
    "model.add(keras.layers.SeparableConv2D(filters=32, kernel_size=3,\n",
    "                                       padding='same',\n",
    "                                       activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "model.add(keras.layers.SeparableConv2D(filters=64, kernel_size=3,\n",
    "                                       padding='same',\n",
    "                                       activation='selu'))\n",
    "model.add(keras.layers.SeparableConv2D(filters=64, kernel_size=3,\n",
    "                                       padding='same',\n",
    "                                       activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "model.add(keras.layers.SeparableConv2D(filters=128, kernel_size=3,\n",
    "                                       padding='same',\n",
    "                                       activation='selu'))\n",
    "model.add(keras.layers.SeparableConv2D(filters=128, kernel_size=3,\n",
    "                                       padding='same',\n",
    "                                       activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "model.add(keras.layers.Flatten())\n",
    "model.add(keras.layers.Dense(128, activation='selu'))\n",
    "model.add(keras.layers.Dense(10, activation=\"softmax\"))\n",
    "\n",
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer = \"sgd\",\n",
    "              metrics = [\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 28, 28, 32)        320       \n",
      "_________________________________________________________________\n",
      "separable_conv2d (SeparableC (None, 28, 28, 32)        1344      \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 14, 14, 32)        0         \n",
      "_________________________________________________________________\n",
      "separable_conv2d_1 (Separabl (None, 14, 14, 64)        2400      \n",
      "_________________________________________________________________\n",
      "separable_conv2d_2 (Separabl (None, 14, 14, 64)        4736      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 7, 7, 64)          0         \n",
      "_________________________________________________________________\n",
      "separable_conv2d_3 (Separabl (None, 7, 7, 128)         8896      \n",
      "_________________________________________________________________\n",
      "separable_conv2d_4 (Separabl (None, 7, 7, 128)         17664     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 3, 3, 128)         0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 1152)              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 128)               147584    \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 184,234\n",
      "Trainable params: 184,234\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 217s 4ms/sample - loss: 2.3022 - accuracy: 0.1136 - val_loss: 2.3021 - val_accuracy: 0.1010\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 225s 4ms/sample - loss: 2.3018 - accuracy: 0.1171 - val_loss: 2.3017 - val_accuracy: 0.1012\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 281s 5ms/sample - loss: 2.3015 - accuracy: 0.1180 - val_loss: 2.3013 - val_accuracy: 0.1226\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 245s 4ms/sample - loss: 2.3012 - accuracy: 0.1226 - val_loss: 2.3009 - val_accuracy: 0.1796\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 275s 5ms/sample - loss: 2.3006 - accuracy: 0.1305 - val_loss: 2.3004 - val_accuracy: 0.0976\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 269s 5ms/sample - loss: 2.3000 - accuracy: 0.1436 - val_loss: 2.2996 - val_accuracy: 0.0980\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 279s 5ms/sample - loss: 2.2990 - accuracy: 0.1639 - val_loss: 2.2988 - val_accuracy: 0.1536\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 188s 3ms/sample - loss: 2.2974 - accuracy: 0.1930 - val_loss: 2.2962 - val_accuracy: 0.1222\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 256s 5ms/sample - loss: 2.2943 - accuracy: 0.2395 - val_loss: 2.2918 - val_accuracy: 0.3334\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 283s 5ms/sample - loss: 2.2875 - accuracy: 0.3134 - val_loss: 2.2810 - val_accuracy: 0.3428\n"
     ]
    }
   ],
   "source": [
    "logdir = './separable-cnn-selu-callbacks'\n",
    "if not os.path.exists(logdir):\n",
    "    os.mkdir(logdir)\n",
    "output_model_file = os.path.join(logdir,\n",
    "                                 \"fashion_mnist_model.h5\")\n",
    "\n",
    "callbacks = [\n",
    "    keras.callbacks.TensorBoard(logdir),\n",
    "    keras.callbacks.ModelCheckpoint(output_model_file,\n",
    "                                    save_best_only = True),\n",
    "    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),\n",
    "]\n",
    "history = model.fit(x_train_scaled, y_train, epochs=10,\n",
    "                    validation_data=(x_valid_scaled, y_valid),\n",
    "                    callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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kSGgT585m9kUYBbwYpdFE4DNadP1dA9wERERyYE553KraFYBPAt83zn3aJdljwM/dM6t9Kb/DHzdOfdKl3rXAtcCVFVVzV68ePHAe1BgkUiEioqKQjdjQIqhD6B++Ekx9AGKox/F0Aconn7MmzdvlXPu+N7q5fKZM2YWBpYCD3YNZs8WYFLa9ERvXgbn3CJgEcC0adNcbW1tLrv3tbq6OgZ7P4qhD6B++Ekx9AGKox/F0Aconn7kKpeztQ34NbDWOXdHD9UeAz7rnbV9EtDinPsgj+0UEREZMnIZOZ8KXAG8bmZrvHk3A5MBnHO/BJ4AzgPWA7uBhflvqoiIyNDQazh7nyNbL3Uc8MV8NUpERGQo0xXCREREfEbhLCIi4jMKZxEREZ9ROIuIiPiMwllERMRnFM4iIiI+o3AWERHxmZwu3ykiIv4WjUapr6+nra0tY/7IkSNZu3ZtgVqVP4OtH2VlZUycOJFwONyv9RXOIiJFoL6+nsrKSqZMmULyqstJra2tVFZWFrBl+TGY+uGco6mpifr6eqZOndqvbeiwtohIEWhra2Ps2LEZwSyFYWaMHTu221GMvlA4i4gUCQWzfwz0tVA4i4iI+IzCWURE8qKioqLQTSgaCmcRERGfUTiLiEheOef46le/yvTp05kxYwaPPPIIAB988AFz587l2GOPZfr06Tz33HPE43GuuuqqVN2f/OQnBW69P+irVCIiReaf/vtN3np/JwDxeJxgMDjgbX704BF85xNH51T30UcfZc2aNbz66qts27aNE044gblz5/LQQw9x9tln881vfpN4PM7u3btZs2YNW7Zs4Y033gBgx44dA25rMdDIWURE8mrlypVcdtllBINBampqOP3003n55Zc54YQTuPfee7n11lt5/fXXqays5NBDD2XDhg1cd911PPnkk4wYMaLQzfcFjZxFRIpM+gjXTxfvmDt3LitWrOD3v/89V111FTfeeCOf/exnefXVV3nqqaf45S9/yeLFi7nnnnsK3dSC08hZRETy6rTTTuORRx4hHo/T2NjIihUrmDNnDu+++y41NTVcc801XH311axevZpt27aRSCS4+OKLue2221i9enWhm+8LGjmLiEheffKTn+T5559n5syZmBk/+tGPGD9+PPfffz+333474XCYiooKHnjgAbZs2cLChQtJJBIA/PM//3OBW+8P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sIBrrrmGbdu28eyzz7J48WKqq6sJh8MsX76cd999t8/bPO2003jwwQc54YQTWLduHe+99x7Tpk1jw4YNHHrooVx//fW89957vPbaaxx55JGMGTOGz3zmM4waNYq77757P/TywFA4i4hIXhx99NG0trYyYcIEDjroIC6//HI+8YlPMGPGDI4//niOPPLIPm/zC1/4Ap///Oc56aSTKCkp4b777qO0tJTFixfzm9/8hnA4zPjx47n55pt5+eWX+epXv0ogECAcDnPXXXfth14eGApnERHJm9dffz1VHjduHM8//3zWepFIpMdtTJkyhTfeSN6luKysjHvvvbfbZ+c33XQTN910U8Z6Z599NmefffZAmu8b+sxZRETEZzRyFhGRgnj99de54oorMuaVlpby4osvFqhF/qFwFhGRgpgxYwZr1qwpdDN8SYe1RUREfEbhLCIi4jMKZxEREZ9ROIuIiPiMwllERA64fd3PWRTOIiIyhMVisUI3ISt9lUpEpMh8+IMfsHdt8n7OsXic7Xm4n3PpUUcy/uabe1yez/s5RyIR5s+fn7HeGWecAcADDzzAj3/8Y8yMY445ht/85jds3bqVz33uc2zYsAGAu+66i4MPPpjzzz8/daWxH//4x0QiEW699VZqa2s59thjWblyJZdddhlHHHEEt912G+3t7YwdO5YHH3yQmpoaIpEI1113Ha+88gpmxne+8x1aWlp47bXX+Ld/+zcA/v3f/5233nqLn/zkJwN6frtSOIuIyIDl837OZWVlLFu2LGO91atX8+abb3Lbbbfxl7/8hXHjxrF9+3YArr/+ek4//XSWLVtGPB4nEonQ3Ny8z320t7fzyiuvANDc3MwLL7yAmXH33Xfzox/9iH/913/le9/7HiNHjkxdkrS5uZlwOMz3v/99br/9dsLhMPfeey+/+tWvBvr0daNwFhEpMukj3MF4P2fnHDfffHPGeg0NDTzzzDNceumljBs3DoAxY8YA8Mwzz/DAAw8AEAwGGTlyZK/hvGDBglS5vr6eBQsW8MEHH9De3s7UqVMBePrpp3n44YdT9UaPHg3AGWecweOPP85RRx1FNBplxowZfXy2eqdwFhGRvOi4n/OHH37Y7X7O4XCYKVOm5HQ/5/6uly4UCpFIJFLTXdcfPnx4qnzddddx4403csEFF1BXV8ett966z21fffXV/OAHP+DII49k4cKFfWpXrnRCmIiI5MWCBQt4+OGHWbJkCZdeeiktLS39up9zT+udccYZ/Od//idNTU0AqcPaZ555Zur2kPF4nJaWFmpqamhoaKCpqYm9e/fy+OOP73N/EyZMAOD+++9PzT/rrLO48847U9Mdo/ETTzyRzZs389BDD3HZZZfl+vT0icJZRETyItv9nF955RVmzJjBAw88kPP9nHta7+ijj+ab3/wmp59+OjNnzuTGG28E4Kc//SnLly9nxowZzJ49m7feeotwOMy3v/1t5syZw1lnnbXPfd96661ceumlzJ49O3XIHOCWW26hubmZ6dOnM3PmTJYvX55a9qlPfYpTTz01dag733RYW0RE8iYf93POtl5raysAV155JVdeeWXGspqaGn73u991287111/P9ddf321+XV1dxvT8+fOznkVeUVGRMZJOt3LlSr7yla/02IeB0shZREQkRzt27OCII46gvLycM888c7/tRyNnEREpiMF4P+dRo0axbt26/b4fhbOISJFwzvX6HWI/Keb7OTvnBrS+DmuLiBSBsrIympqaBhwKMnDOOZqamigrK+v3NjRyFhEpAhMnTqS+vp7GxsaM+W1tbQMKCb8YbP0oKytj4sSJ/V5f4SwiUgTC4XDqylbp6urqmDVrVgFalF/F0o9c6bC2iIiIzyicRUREfEbhLCIi4jMKZxEREZ9ROIuIiPiMwllERMRnFM4iIiI+02s4m9k9ZtZgZm/0sNzM7Gdmtt7MXjOz4/LfTBERkaEjl5HzfcA5+1h+LnC497gWuGvgzRIRERm6eg1n59wKYPs+qswHHnBJLwCjzOygfDVQRERkqMnHZ84TgM1p0/XePBEREekHy+UOJmY2BXjcOTc9y7LHgR8651Z6038Gvu6ceyVL3WtJHvqmqqpq9uLFiwfUeD+IRCJUVFQUuhkDUgx9APXDT4qhD1Ac/SiGPkDx9GPevHmrnHPH91YvHze+2AJMSpue6M3rxjm3CFgEMG3aNFdbW5uH3RdWXV0dg70fxdAHUD/8pBj6AMXRj2LoAxRPP3KVj8PajwGf9c7aPglocc59kIftioiIDEm9jpzN7LdALTDOzOqB7wBhAOfcL4EngPOA9cBuYOH+aqyIiMhQ0Gs4O+cu62W5A76YtxaJiIgMcbpCmIiIiM8onEVERHxG4SwiIuIzCmcRERGf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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 3)\n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
